#include "cart_liat.h"

/**
 * @brief 链表头结点的初始化
 *
 * @param L 	保存头结点的变量的地址
 * @return true
 * @return false
 */
bool InitList(pLinkList *L)
{
	// 在堆空间申请头结点的内存空间(一个结构体大小)
	*L = calloc(1, sizeof(LNode));
	if (*L == NULL)
		return false;

	(*L)->next = NULL;
	return true;
}

/**
 * @brief 链表任意位置插入结点数据
 *
 * @param L 头结点变量
 * @param index 插入的位置（1~  链表的尾结点位置+1)
 * @param e 插入的数据
 * @return true
 * @return false
 */
bool InsertLinst(pLinkList L, int index, ElemType e)
{
	if (L == NULL) // 头结点为空
		return false;
	pLinkList p = L;
	int num = 0;
	// 寻找插入结点的前一个结点的位置,p指向插入位置的前一个结点
	while (p != NULL && num < index - 1)
	{
		p = p->next;
		num++;
	}
	if (p == NULL || num >= index) // p == NULL防止在后面插入的位置跳跃
								   // num >= index防止在头结点前面插入
	{
		return false;
	}

	pLinkList new_node = calloc(1, sizeof(LNode)); // 申请结点堆空间，把新数据存到这个结点
	if (new_node == NULL)
		return false;
	new_node->set_number = 1;
	strcpy(new_node->data, e);
	new_node->next = p->next; // 新结点插入到链表里，先连后面链子
	p->next = new_node;		  // 再连前面链子
	return true;
}

/**
 * @brief 链表任意位置删除结点
 *
 * @param L 链表的头结点指针
 * @param index 删除的位置（1~  链表的尾结点位置)
 * @return true
 * @return false
 */
bool ListDelete(pLinkList L, ElemType e)
{
	if (L == NULL)
		return false;

	pLinkList p = L->next; // 从头结点的下一个节点开始遍历
	pLinkList prev = L;	   // prev保存前一个节点的指针

	while (p != NULL)
	{
		if (strcmp(p->data, e) == 0) // 如果找到匹配的节点
		{
			prev->next = p->next; // 将前一个节点的next指针指向要删除节点的下一个节点
			free(p);			  // 释放要删除节点的内存
			return true;		  // 删除成功
		}
		prev = p;
		p = p->next;
	}

	return false; // 没有找到匹配的节点
}

/**
 * @brief 链表的销毁
 *
 * @param L 头结点的变量的地址
 */
void ListDestory(pLinkList *L)
{
	if (*L == NULL)
	{
		printf("List is NULL\r\n");
		return;
	}
	pLinkList delete = NULL;
	pLinkList p = *L;
	while (p != NULL)
	{
		delete = p;
		p = p->next;
		free(delete);
	}
	*L = NULL;
	printf("List Destory successfully\r\n");
}

bool LocateElem(pLinkList L, ElemType e)
{
	
	if (L == NULL)
		return false;

	pLinkList p = L->next; // 头结点不存数据
	while (p != NULL)
	{
		if (strcmp(p->data, e) == 0) // 数值比较
			break;
		else
			p = p->next; // 比较失败，p指向下一个结点继续寻找
	}
	if (p == NULL)
		return false;
	else
		return true;
}

/**
 * @brief 链表的修改
 *
 * @param L 链表的头结点指针
 * @param index 修改结点的位置
 * @param e 修改后的值
 * @return true
 * @return false
 */
bool ModifyElem(pLinkList L, ElemType e)
{

	if (L == NULL)
		return false;
	pLinkList p = L->next;
	while (p != NULL) // 寻找要找的结点位置，p指向该位置
	{
		if (strcmp(p->data, e) == 0)
		{
			break;
		}
		p = p->next;
	}
	if (p == NULL)
		return false;
	else
	{
		p->set_number = p->set_number + 1; // 找到该位置，修改该位置的值
		printf("Modif%d\r\n", p->set_number);
		return true;
	}
}

